import java.util.Random;//和下面一行类似，都是导入包
import java.util.Scanner;//导入包，类似于C语言中的include

public class HelloWorld {
    public static void main1(String[] args) {  //main或者psvm可以快捷生成mian方法
        System.out.println("HelloWorld");      //这里的println可以输入sout快捷生成，这个语句和C语言中的printf类似
        int a = 10;
        int b = 20;

        //System.out.println("a = " + a + "b = " + b);
        String c = "123";
        int d = Integer.parseInt(c);//这里的str必须是一个合法的字符串数字
        // System.out.println(5 / 0);分子是整数的情况会视为无穷大，但是分子是小数的时候会视为异常
        //求模运算的值最后跟被求模运算符号前面的数字保持一致
        //String不是基本数据类型，叫做引用数据类型
        //只要+左右之间是字符串都可以进行自由连接，并且就算是代表数值的字母也可以进行连接，就像上一行所表示的那样
        //在Java中随便是什么，只要两边加上了双引号“”就会将他视为字符串，就可以用'+'进行连接
        //Java中’+‘可以实现两个字符串之间的拼接
        //行注释ctrl+/
        //块注释ctrl+shift+/
        //当局部变量没有被初始化的时候是没有办法被使用的
        //int不管在多少位操作系统中始终是4位
        //java没有有符号和无符号的区别
        //byte 字节型，只有一个字节
        //boolean 在JVM中没有明确的大小，java中int类型喝boolean类型之间不能转换，不存在0表示false和1代表true
        //强制类型转换和现实类型转换可能会存在数据损失，其次，转换必须是相同类型数据
        //所有小于四个字节的变量都会被提升为四个字节，比如bite，就算它本身是小于两个字节是数据
        //C语言没有字符串类型，但是Java有，用string声明
        //+表示拼接，可以连接两个字符串
        //包装类型是基本数据类型所对应的 “ 类 ” 的类型(类是面向对象和面向过程的主要区别所在)
        //  5.0/0 (就是0做分母的情况)Java将会把其表示为无穷大
        //对于两串或多串二进制数字按照对应的顺序排列，
        //按位与 ’&‘ 只有对应的位置上全部为1才为1
        //按位或 ’|‘ 只要对应位置上有1就为1
        //按位异或 ’^' 将两串数字中不一样的地方取反
        //按位取反 ‘~’ 对一串数字进行按位取反，就是将数字中的1换成0，0换成1
        //移位运算符  左移 ‘<<' 最左侧不要了，最右侧补0
        //          右移 ’>>' 最右侧不要了，最左侧补符号位（正数补0，负数补1）
        //（左移相当于乘2，右移相当于除2）移多少位就相当于乘或者除多少个2
        //位运算比普通的乘除要快
        //>>>无符号右移，不管符号位是0还是1，统统补0
        //三目运算符，与C语言类似
        //且表达式是bool表达式
        //Java没有逗号表达式
        //if语句也和C语言类似
        //switch和C语言类似(包括break)
        //不能做switch的数据类型有long、float、double、boolean但是string可以作为数据类型
        //switch不能表示太复杂的条件，且switch可以嵌套使用

        //Java中的调试
        //1.打断点
        //2.鼠标右键，点debug
        //3.在断点处鼠标右键可以设置条件
        //Math.pow()幂运算
        //Math.qrt根号运算

        //Java中没有方法声明一说（类似于C语言中的函数声明）
        //方法内部遇到return会自动回收方法的栈帧
        //只有在调用的时候才会运行方法内部的代码
        //没有返回值的方法不能进行打印

        //fac（）会对数字进行阶乘运算

    }

    public static void main2(String[] args) {
        int i = 1;
        int result1 = 0;

        while (i <= 100) {
            if (i % 2 == 1) {
                result1 += i;
            }
            i++;
        }//计算0-100之间的奇数和
        int k = 1;
        int result2 = 0;

        while (k <= 100) {
            if (k % 2 == 0) {
                result2 += k;
            }
            k++;
        }//计算0-100之间的偶数和
        System.out.println("0-100之间奇数的和:" + result1);
        System.out.println("0-100之间偶数的和:" + result2);
    }

    public static void main3(String[] args) {
        int i = 1;

        while (i <= 100) {
            if (i % 3 == 0 && i % 5 == 0) {
                System.out.println(i);
            }
            i++;
        }
    }//不使用continue和break的代码

    public static void main4(String[] args) {
        int i = 1;

        while (i <= 100) {
            if (i % 15 != 0) {
                i++;
                continue;
            } else {
                System.out.println(i);
                i++;
            }
        }
        //for循环
        //for(表达式一（只会被执行一次)；布尔表达式二；表达式三）和C语言类似
    }//使用continue的代码

    //使用break无法实现目标
    public static void main5(String[] args) {
        System.out.println("输出且换行");
        System.out.print("输出不换行");
        System.out.printf("%s\n", "格式化输出");
    }//输出

    public static void main6(String[] args) {
        Scanner scan = new Scanner(System.in);//一种固定写法(System.in指从键盘输入）

        System.out.println("请输入你的姓名：");
        String name = scan.nextLine();//读入输入的一行，可以输入空格
        //但是使用scan.next不能读取空格，就是读取到空格就停止读取
        System.out.println(name);

        System.out.println("请输入你的年龄：");
        int age = scan.nextInt();//读入整数(固定写法)
        System.out.println(age);

        scan.close();//将文件视为资源，当文件使用完毕之后，使用该函数进行关闭
    }//输入，直接使用Scanner

    public static void main7(String[] args) {
        //如果要重复输入并要限制输入的次数，可以加上while来控制

        Scanner scan = new Scanner(System.in);

        while (scan.hasNextInt()) {
            int age = scan.nextInt();
            System.out.println(age);
        }//ctrl + d 可以停止循环

        scan.close();
    }

    //猜数字游戏
    public static void main8(String[] args) {
        Scanner scan = new Scanner(System.in);

        Random random = new Random();
        int randNum = random.nextInt(100);//随机生成一个[0,100)之间的数
        System.out.println("随机数是" + randNum);
        //如果没有标注范围，那么生成的随机数是Java中int的取值范围1

        while (true) {
            System.out.println("请输入要猜的数字:");
            int num = scan.nextInt();

            if (num < randNum) {
                System.out.println("猜小了！");
            } else if (num > randNum) {
                System.out.println("猜大了！");
            } else {
                System.out.println("猜对了！");
                break;
            }
        }
        scan.close();
    }

    //根据年龄，来打印出当前年龄的人是少年、青年、中年还是老年
    public static void main9(String[] args) {
        Scanner scan = new Scanner(System.in);
        int age = scan.nextInt();
        if (age <= 18 && age >= 0) {
            System.out.println("少年！");
        } else if (age > 18 && age <= 28) {
            System.out.println("青年！");
        } else if (age > 28 && age <= 55) {
            System.out.println("中年！");
        } else {
            System.out.println("老年！");
        }
        scan.close();
    }

    //判断一个数是否是素数
    public static void main10(String[] args) {
        Scanner scan = new Scanner(System.in);

        int num = scan.nextInt();

        if (num == 1) {
            System.out.println("素数！");
        }
        boolean flag = true;
        if (num > 1) {

            for (int i = 2; i <= num; i++) {
                if (num % i == 0 && i != num) {
                    flag = false;
                    break;
                }
            }
        }
        if (flag) {
            System.out.println("素数！");
        } else {
            System.out.println("不是素数！");
        }
        scan.close();
    }

    //打印0-100之间的所有素数
    public static void main11(String[] args) {
        for (int i = 1; i <= 100; i++) {
            boolean flag = true;

            for (int k = 1; k < i; k++) {
                if (i % k == 0 && k != 1) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println(i);
            }
        }
    }

    //输出1000-2000之间的所有的闰年
    public static void main12(String[] args) {
        for (int i = 1000; i <= 2000; i++) {
            if (i % 4 == 0) {
                if (i % 100 == 0) {
                    if (i % 400 == 0) {
                        System.out.println(i);
                    }
                } else {
                    System.out.println(i);
                }
            }
        }
    }

    //输出乘法口诀表
    public static void main13(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = i; j <= 9; j++) {
                System.out.println(i + "*" + j + "=" + i * j);
            }
        }
    }

    //求两个正整数的最大公约数
    public static void main14(String[] args) {
        Scanner scan1 = new Scanner(System.in);
        Scanner scan2 = new Scanner(System.in);

        int num1 = scan1.nextInt();
        int num2 = scan2.nextInt();

        int num = Math.min(num1, num2);
        int max = 0;

        for (int i = 1; i <= num; i++) {
            if (num1 % i == 0 && num2 % i == 0) {
                max = i;
            }
        }
        System.out.println("这两个数之间的最大公因数为：" + max);
    }

    //求出0-999之间的所有水仙花数（水仙花数的各位数字的立方和等于该数本身）并输出
    public static void main15(String[] args) {
        for (int i = 100; i <= 999; i++) {
            int num1 = i / 100;
            int num2 = (i / 10) % 10;
            int num3 = i % 10;
            int num = (int) (Math.pow(num1, 3) + Math.pow(num2, 3) + Math.pow(num3, 3));

            if (i == num) {
                System.out.println(i);
            }
        }
    }

    //写出一个函数，返回二进制参数中的1的个数
    public static void main(String[] args) {
        System.out.println("请输入一个十进制数：");
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();

        String binaryString = Integer.toBinaryString(num);
        int n = 0;
        for(int i = 0;i < binaryString.length();i ++){
            if(binaryString.charAt(i) == '1'){
                n ++;
            }
        }
        System.out.println("该十进制数所对应的二进制数中所含1的个数为：" + n);
    }
}